package Day2;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;

public class Game {
	// 获取控制台输入信息的对象
	Scanner scanner = new Scanner(System.in);
	// 解药 毒药
	int saveMedicine = 1;
	int killMedicine = 1;
	// 获取当晚死亡人的集合
	List<Player> diePlayer = new ArrayList<Player>();
	// 接收所有的玩家的信息的
	List<Player> list = new ArrayList<Player>();
	// 判定胜负的
	int result;
	// 女巫是否死亡的
	// 思考：player.getIdentity().equals("女巫") && player.getState()!=0
	// 当天晚上 狼人恰巧猎杀到了女巫，女巫是发动不了技能的！
	boolean witchDie = false;

	public static void main(String[] args) {
		Game game = new Game();
		game.init();
		while (true) {
			game.darkTime();
			game.result = game.winner();
			if (game.result == 1) {
				System.out.println("好人获胜");
				break;
			}
			if (game.result == 2) {
				System.out.println("狼人获胜！");
				break;
			}
			game.dayTime();
			game.result = game.winner();
			if (game.result == 1) {
				System.out.println("好人获胜");
				break;
			}
			if (game.result == 2) {
				System.out.println("狼人获胜！");
				break;
			}
		}
	}
	/**
	 * 初始化所有玩家的信息及身份
	 */
	public void init() {
		String identity[] = { "预言家", "女巫", "猎人", "白痴", "平民", "平民", "平民", "平民", "狼人", "狼人", "狼人", "狼人" };
		List<Integer> nums = new ArrayList<Integer>();
		//遍历从0-11的数字 12个数字
		for (int i = 0; i < identity.length; i++) {
			nums.add(i);
		}
		// 0 1 2 3 4 5 6 7 8 9 10 11
		Collections.shuffle(nums);// 0-11 乱序
		// 9 11 10 0 2 1 3 5 4 6 7 8
		//目的 从identity数组当中随机获取身份
		Player player = null;
		for (int i = 0; i < identity.length; i++) {
			player = new Player();
			player.setName("玩家" + (i + 1)); //玩家1，玩家2....
			player.setIdentity(identity[nums.get(i)]); //identity[9] 玩家1 身份：狼人
			player.setState(0);//初始玩家都是存活状态
			list.add(player); //添加到玩家信息集合当中
		}
		System.out.println("----------狼人杀开始---------");
		System.out.println("身份如下：");
		System.out.println(list.get(0).getName() + ":" + list.get(0).getIdentity() + "\t" + list.get(6).getName() + ":"
				+ list.get(6).getIdentity());
		System.out.println(list.get(1).getName() + ":" + list.get(1).getIdentity() + "\t" + list.get(7).getName() + ":"
				+ list.get(7).getIdentity());
		System.out.println(list.get(2).getName() + ":" + list.get(2).getIdentity() + "\t" + list.get(8).getName() + ":"
				+ list.get(8).getIdentity());
		System.out.println(list.get(3).getName() + ":" + list.get(3).getIdentity() + "\t" + list.get(9).getName() + ":"
				+ list.get(9).getIdentity());
		System.out.println(list.get(4).getName() + ":" + list.get(4).getIdentity() + "\t" + list.get(10).getName() + ":"
				+ list.get(10).getIdentity());
		System.out.println(list.get(5).getName() + ":" + list.get(5).getIdentity() + "\t" + list.get(11).getName() + ":"
				+ list.get(11).getIdentity());
		System.out.println("-----------------------------");
	}
	
	/**
	 * 黑夜方法：包含了预言家方法，女巫的方法
	 */
	public void darkTime() {
		int killTonight = -1; //当晚狼人猎杀的对象
		diePlayer.clear(); //每天黑夜开始前 清空当晚的死亡集合的
		System.out.println("------狼人请行动-------");
		System.out.println("天黑喽！！狼人请选择一名猎杀目标！");
		System.out.print("目前存活的人：");
		for (Player player : list) {
			if (player.state == 0)
				System.out.print(player.getName() + "  ");
		}
		System.out.println();
		int num = -1;
		num = Integer.parseInt(scanner.nextLine());
		list.get(num - 1).setState(1); //表示被猎杀了
		killTonight = num - 1;
		diePlayer.add(list.get(killTonight));
		System.out.println("狼人行动结束！");
		prophet(killTonight); //预言家
		witch(killTonight); //女巫
	}

	/**
	 * 白天的逻辑
	 */
	public void dayTime() {
		int num;
		System.out.println("天亮了！");
		if (diePlayer.size() == 0) {
			System.out.println("今天是平安夜");
		} else {
			System.out.println("今天死亡的是：");
			for (Player player : diePlayer) {
				System.out.print(player.getName() + "  ");
			}
			System.out.println();
			//当夜晚死亡的人里面有猎人，且猎人不是被毒死的
			for (Player player : diePlayer) {
				if (player.getIdentity().equals("猎人") && player.getState() == 1) {
					System.out.println(player.getName() + "身份为：猎人，可以发动技能!请输入序号！");
					hunter();
				}
			}
		}
		speak();
		System.out.println("开始进入公投阶段！");
		System.out.print("目前存活的人：");
		for (Player player1 : list) {
			if (player1.state == 0)
				System.out.print(player1.getName() + "  ");
		}
		System.out.println("请投票！");
		num = Integer.parseInt(scanner.nextLine());
		//如果是白痴神 免疫放逐 如果是猎人的话，开枪带走人 其他玩家，只需要把玩家的状态改成1
		if (list.get(num - 1).getIdentity().equals("白痴")) {
			System.out.println(list.get(num - 1).getName() + " 身份为白痴，免疫此次放逐！");
		} else if (list.get(num - 1).getIdentity().equals("猎人")) {
			list.get(num - 1).setState(1);
			System.out.println("请" + list.get(num - 1).getName() + " 发表遗言！");
			scanner.nextLine();
			System.out.println(list.get(num - 1).getName() + " 身份为猎人，可以发动技能！");
			hunter();
		} else {
			list.get(num - 1).setState(1);
			System.out.println("请" + list.get(num - 1).getName() + " 发表遗言！");
			scanner.nextLine();
		}
	}

	/**
	 * 发言阶段
	 */
	public void speak() {
		//生成0-11随机数
		int ramdomNum = (int) (Math.random() * list.size());//7 8 9 10 11 0 1 2 3 4 5 6
		System.out.println("随机开始发言！");
		for (int i = ramdomNum; i < list.size();) {
			if (list.get(i).state == 0) {
				//玩家8 存活状态，才可以发言
				System.out.println(list.get(i).name + "发言：");
				scanner.nextLine();
			}
			i++; //避免死循环
			//当玩家达到最大值，从玩家1开始发言
			if (i == list.size()) {
				i = 0;
			}
			//如果已经经过了一个轮回，我就跳出
			if (i == ramdomNum) {
				break;
			}
		}

	}
	/**
	 * 猎人已经死亡发动开枪技能的逻辑
	 */
	public void hunter() {
		int num = -1;
		System.out.print("目前存活的人：");
		for (Player player1 : list) {
			if (player1.state == 0)
				System.out.print(player1.getName() + "  ");
		}
		System.out.println();
		num = Integer.parseInt(scanner.nextLine());
		if (num != -1) {
			list.get(num - 1).state = 1; 
			System.out.println(list.get(num - 1).getName() + "被猎杀！");
		}
	}

	/**
	 * 预言家的行动 
	 * @param killTonight 表示今天晚上杀的人
	 * 为什么我要这个参数？？？
	 * 预言家2号玩家 狼人当天把2号恰巧杀了 2号玩家可不可以验人？？
	 * 期望：可以
	 */
	public void prophet(int killTonight) {
		int num = -1;
		System.out.println("-----预言家行动-----");
		System.out.println("请查验一名玩家身份！");
		num = Integer.parseInt(scanner.nextLine());
		for (Player player : list) {
			//判定预言家且预言家的状态是存活状态 （或者） 当天晚上杀的人恰巧是预言家
			if ((player.identity.equals("预言家") && player.getState() == 0)
					|| (list.get(killTonight).getIdentity().equals("预言家") && player.getState() == 1)) {
				if (list.get(num - 1).camp.equals("神") || list.get(num - 1).camp.equals("民"))
					System.out.println("该名玩家身份：" + "好人");
				else
					System.out.println("该名玩家身份：" + "狼人");
				break;
			}
		}
		System.out.println("-----预言家行动结束！-----");
	}
	/**
	 * 女巫的逻辑
	 * @param killTonight
	 */
	public void witch(int killTonight) {
		int num;
		System.out.println("----女巫请行动-----");
		//如果女巫死了，结束女巫的行动
		if (witchDie) {
			System.out.println("女巫行动结束！");
			return;
		}
		//解药存在的时候，执行的逻辑
		if (saveMedicine == 1) {
			if (killTonight != -1) {
				System.out.println("今天晚上" + list.get(killTonight).getName() + "死了");
				System.out.println("是否使用解药？使用：1 不使用：2");
				num = Integer.parseInt(scanner.nextLine());
				if (num == 1) {
					saveMedicine = 0; //解药用掉了
					list.get(killTonight).state = 0; //猎杀的玩家复活
					diePlayer.clear(); //清空当晚死亡的人的集合 因为女巫当晚使用解药的时候，不能使用 
					System.out.println("-----女巫行动结束-----");
					return;
				}
			}
		}
		//逻辑判断毒药是否可以使用
		for (Player player : list) {
			//判断女巫是不是当天晚上被杀
			if (diePlayer.get(0).getIdentity().equals("女巫")) {
				break;
			}
			//女巫已经被杀死了（非当晚），废弃掉毒药
			if (player.getIdentity().equals("女巫") && player.getState() != 0) {
				killMedicine = 0; //毒药废弃掉了
				witchDie = true;
			}
		}
		//不会进入毒药的逻辑
		if (killMedicine == 1) {
			System.out.println("是否使用毒药,使用：1 不使用：2");
			num = Integer.parseInt(scanner.nextLine());
			if (num == 1) {
				System.out.println("输入你要毒杀的序号！");
				System.out.print("目前存活的人：");
				for (Player player : list) {
					if (player.state == 0)
						System.out.print(player.getName() + "  ");
				}
				System.out.println();
				num = Integer.parseInt(scanner.nextLine());
				list.get(num - 1).state = 2; //毒杀
				diePlayer.add(list.get(num - 1));
				killMedicine = 0; //用掉毒药
			}
		}
		System.out.println("-----女巫行动结束-----");
	}

	/**
	 * 判定胜负
	 * @return
	 */
	public int winner() {
		int wolves = 0; //狼阵营
		int farmers = 0; //民阵营
		int gods = 0; //神阵营
		for (Player player : list) {
			if (player.state != 0) {
				switch (player.camp) {
				case "民":
					farmers++;
					break;
				case "神":
					gods++;
					break;
				case "狼":
					wolves++;
					break;
				}
			}
		}
		//当有一个阵营的死亡人数达至4人，这一方阵营全灭
		if (farmers == 4) {
			return 2;
		} else if (gods == 4) {
			return 2;
		} else if (wolves == 4) {
			return 1;
		}
		return 0;
	}
}

